package chapter02;

import java.util.ArrayDeque;
import java.util.Deque;

public class SimplifyPath71 {
    /**
     * 模拟
     * 分情况讨论
     * i=0
     * c=chs[i]
     * simpPath=""
     * 1).c当前字符为'/'
     *    跳过后面连续的'/'
     *    如果simpPath.length>0&&simpPath[str.length-1]=='/' str末尾是'/'  '/'无需添加到str中
     *    否则simpPath.add(c)
     * 2).c当前字符为'.'
     *    a).若是"./xxx"或者chs结尾就是"."
     *      i+1<chs.length&&chs[i+1]=='/'||i+1==chs.length
     *      跳过"./"  i=i+2
     *    b).若是"../xxx"或者chs结尾就是".."
     *      i+2<chs.length&&chs[i+2]=='/'||i+2==chs.length&&chs[i+1]=='.'
     *      从str删除倒数第一个"xxx/"形式字串
     *      "yyy/xxx/" 先删除'/'->"yyy/xxx" 知道再次遇到'/'为止->"yyy/"
     *      要确保str不是"/"
     *      if(!(simpPath.length()==1)){
     *           simpPath.deleteCharAt(simpPath.length()-1);
     *           while (simpPath.length()>1&&simpPath.charAt(simpPath.length()-1)!='/'){
     *           simpPath.deleteCharAt(simpPath.length()-1);
     *         }
     *      }
     *     跳过"../"  i=i+3
     *    c).其他形式 就是目录 需要原样添加到str
     *      从当前'.'开始添加 直到遇到'/'为止
     *      while (i<chs.length&&chs[i]!='/'){
     *         simpPath.append(chs[i++]);
     *     }
     * 3).其他字符
     *    从当前位置开始添加 知道遇到'/'为止
     *    while (i<chs.length&&chs[i]!='/'){
     *        simpPath.append(chs[i++]);
     *    }
     * 特别：除了"/"要求末尾不能有'/' 如果simpPath.length()>1&&simpPath.charAt(simpPath.length()-1)=='/'
     *    删除末尾'/'
     */
    public String simplifyPath(String path) {
        char[] chs=path.toCharArray();
        StringBuffer simpPath=new StringBuffer();
        int i=0;
        while (i<chs.length){
            char c=chs[i];
            if(c=='/'){
                while (i<chs.length&&chs[i]=='/'){
                    i++;
                }
                if(simpPath.length()>0&&simpPath.charAt(simpPath.length()-1)=='/'){
                    continue;
                }
                simpPath.append(c);
            }else if(c=='.'){
                if(i+1<chs.length&&chs[i+1]=='/'||i+1==chs.length){
                    i+=2;
                }else if(i+2<chs.length&&chs[i+2]=='/'||i+2==chs.length&&chs[i+1]=='.'){
                    if(!(simpPath.length()==1)){
                        simpPath.deleteCharAt(simpPath.length()-1);
                        while (simpPath.length()>1&&simpPath.charAt(simpPath.length()-1)!='/'){
                            simpPath.deleteCharAt(simpPath.length()-1);
                        }
                    }
                    i+=3;
                }else{
                    while (i<chs.length&&chs[i]!='/'){
                        simpPath.append(chs[i++]);
                    }
                }
            }else{
                while (i<chs.length&&chs[i]!='/'){
                    simpPath.append(chs[i++]);
                }
            }
        }
        if(simpPath.length()>1&&simpPath.charAt(simpPath.length()-1)=='/'){
            simpPath.deleteCharAt(simpPath.length()-1);
        }
        return simpPath.toString();
    }

    //分割字符串 双端队列
    public String simplifyPath1(String path) {
        String[] strs=path.split("/");
        Deque<String> deque=new ArrayDeque<>();
        for(String str:strs){
            if("..".equals(str)){
                if(!deque.isEmpty()){
                    deque.removeLast();
                }
            }else if(str.length()>0&&!".".equals(str)){
                deque.addLast(str);
            }
        }
        StringBuffer res=new StringBuffer();
        if(deque.isEmpty()){
            res.append("/");
        }else{
            while (!deque.isEmpty()){
                res.append("/");
                res.append(deque.removeFirst());
            }
        }
        return res.toString();
    }
}
